package com.tbynet.jwp.framework.exception;

import com.tbynet.jwp.framework.core.JwpException;

/**
 * 数据访问异常（SQL错误、数据库连接失败）
 * 1. 捕获 JFinal 的数据库异常（如 SqlException）
 * 2. 包装为 RepositoryException 向上抛出
 * 3. 禁止吞异常（即 catch 后不处理也不抛出）
 * 示例：
 * 调用 Db.save () 时捕获 SqlException，包装为 “保存订单数据失败” 后抛出 RepositoryException
 * @author 佰亿互联
 * @version 3.1
 * @since 2025-11-04
 */
public class RepositoryException extends JwpException {

    private final String sql; // 执行的SQL语句，用于定位数据层问题

    /*
     * 构造方法1：参数验证异常（无底层异常）
     * Repository 层的参数验证需遵循 **「最小必要原则」**，仅验证与数据访问直接相关的参数，不处理业务语义校验
     * （如 “库存是否充足” 属于 Service 层业务校验，“库存数量是否为负数” 属于 Repository 层数据合法性校验）
     * 必须：数据访问合法性校验
     * 1. SQL 查询的主键 ID 是否为 null / 负数
     * 2. 批量操作的集合是否为空
     * 3. 分页参数（页码 / 页大小）是否为负数
     * 建议：数据格式合法性校验
     * 1. 手机号是否为 11 位数字（基础格式，非 “是否已注册”）
     * 2. 日期字符串是否符合格式
     * 禁止：业务规则合理性校验
     * 1. 库存扣减后是否为负数
     * 2. 用户是否已存在
     * 3. 订单金额是否大于 0（业务语义）
     * @param message 错误信息
     */
    public RepositoryException(String message) {
        super("REPOSITORY_PARAM_ERROR", message);
        this.sql = null;
    }

    // 构造方法2：数据库操作异常（携带底层异常，如SQLException）
    public RepositoryException(String message, Throwable cause) {
        super("REPOSITORY_SQL_ERROR", message);
        super.initCause(cause);
        this.sql = null;
    }

    public String getSql() { return sql; }
}
